#ifndef COLAPHEAP_CPP
#define COLAPHEAP_CPP

#include"ColaPHeap.h"

template<class T, class P>
ColaPHeap<T, P> ::ColaPHeap(int tamMax){
    Vacio(tamMax);
}

template<class T, class P>
void ColaPHeap<T,P> ::Insertar(T &dato,const P &prioridad){
    heap * aux = new nodoColaP();
    aux->dato = dato;
    aux->prioridad = prioridad;
    int i;
    if(!EsVacia()){
        for(i =++tope; arreglo[i/2].prioridad > prioridad; i/=2)
		{
			arreglo[i].prioridad = arreglo[i/2].prioridad;
			arreglo[i].dato = arreglo[i/2].dato;

		}
		arreglo[i].prioridad =aux->prioridad;
		arreglo[i].dato = aux->dato;
	}
	else {
		tope++;
		arreglo[tope].prioridad = aux->prioridad;
		arreglo[tope].dato = aux->dato;		
	}	
}

template<class T, class P>
void ColaPHeap<T, P> :: EliminarMin(){
    int i, hijo;
    heap UltElement;
    int aux=tope--;
    UltElement.dato = arreglo[aux].dato;
    UltElement.prioridad = arreglo[aux].prioridad;
    for(i=1; i*2 <= tope; i=hijo){
        hijo=i*2;
        if(hijo!=tope && arreglo[hijo+1].prioridad < arreglo[hijo].prioridad)//CAMBIO
            hijo++;
        if(UltElement.prioridad > arreglo[hijo].prioridad){//CAMBIO
            arreglo[i].dato = arreglo[hijo].dato;
			arreglo[i].prioridad = arreglo[hijo].prioridad;
        }
        else
            break;
	}
    arreglo[i].dato = UltElement.dato;
	arreglo[i].prioridad = UltElement.prioridad;
}

template<class T, class P>
T& ColaPHeap<T, P> :: ObtenerMin(){
	return arreglo[1].dato;
}

template<class T, class P>
void ColaPHeap<T,P> :: Decolar(){
    for(int i=1;i<tope;i++){
        arreglo[i]=arreglo[i+1];
    }
    tope--;
}

template<class T, class P>
bool ColaPHeap<T, P> :: EsVacia(){
	
	return tope == 0;

}
template<class T, class P> 
bool ColaPHeap<T, P> :: EstaLlena(){
	
	return tope == capacidad;

}
template<class T, class P>    
ColaPHeap<T, P> :: ~ColaPHeap(){
	
	delete []arreglo;

}
	
template<class T, class P>    
void ColaPHeap<T, P> :: Vacio(int tamMax){
	arreglo = new heap[tamMax+1];
    this->tope=0;
    this->capacidad=tamMax;
    this->arreglo[0].dato=NULL;
    this->arreglo[0].prioridad=MENOS_INFINITO;
}


	
#endif